package ptumall.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import ptumall.model.Users;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class JWTUtils {

    @Value("${jwt.secret}") // 从配置文件中读取密钥
    private String secret;

    @Value("${jwt.expireTime}") // 从配置文件中读取 Token 过期时间（单位：毫秒）
    private long expiration;

    // 生成 JWT Token
    public String generateToken(Users user) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("openid", user.getOpenid()); // 将微信 openid 存入 Token

        return Jwts.builder()
                .setClaims(claims) // 设置自定义数据
                .setIssuedAt(new Date()) // 设置 Token 签发时间
                .setExpiration(new Date(System.currentTimeMillis() + expiration)) // 设置 Token 过期时间
                .signWith(getSecretKey(), SignatureAlgorithm.HS256) // 使用密钥签名
                .compact();
    }

    // 验证 JWT Token 是否有效
    public boolean validateToken(String token) {
        try {
            Claims claims = Jwts.parserBuilder()
                    .setSigningKey(getSecretKey()) // 使用密钥验证签名
                    .build()
                    .parseClaimsJws(token)
                    .getBody();

            // 检查 Token 是否过期
            Date expiration = claims.getExpiration();
            return !expiration.before(new Date()); // 如果未过期，返回 true
        } catch (Exception e) {
            // 如果解析失败或 Token 无效，返回 false
            return false;
        }
    }

    // 获取密钥
    private SecretKey getSecretKey() {
        return Keys.hmacShaKeyFor(secret.getBytes());
    }
}
